﻿using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using 第五课.Models;
using 第五课.Models.Database;

namespace 第五课.Controllers
{
    [Route("/[action].html")]
    [Route("[controller]/[action]")]
    public class HomeController : Controller
    {
        private readonly Store_2022Context _db;
        public HomeController(Store_2022Context db)
        {
            _db = db;
        }
        //使用数据库查询

        //1、查询数据 条件查询 var list =_db.表名.Where().Tolist();

        //2、把list传递到页面上  ViewData ViewBag ViewModel

        //3、把传递过来的数据 渲染到页面





        public IActionResult Index()
        {
            return View();
        }

        public IActionResult Detail(int id)
        {
            //数据查询

            //一个商品数据
            //上下文.表名.查询一个商品(根据条件) 哪个商品
            var good = _db.Goods.FirstOrDefault(x => x.Id == id);
            //2、传递 数据
            //      参数的名字    参数的值
            ViewData["Good"] = good;
            return View();
        }
        //分类 
        public IActionResult Market(int cateId)//形参里面的值是通过网址后加 ?cateId=1 来进行获取的
        {
            //1、查询 分类数据
            //           数据库上下文 所有分类结果
            var cates = _db.Categories.ToList();


            //2、传递 分类数据
            //      参数的名字    参数的值
            ViewData["Cates"] = cates;

            //当初次进入网页 传入的cateId默认为0 需对其进行判断调整
            if (cateId == 0)
            {
                //设置cateId为第一个分类的id
                cateId = cates.FirstOrDefault().Id;
            }

            //根据商品分类id来进行搜索商品数据
            var goods = _db.Goods.Where(x => x.CateId == cateId).ToList();
            ViewData["Goods"] = goods;
            ViewData["cateId"] = cateId;

            return View();
        }
        public IActionResult About()
        {
            return View();
        }
        //添加授权标签
        [Authorize]
        public IActionResult Userinfo()
        {
            //获取授权中的用户Id
            var userId = Convert.ToInt32(HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier).Value);
            //在数据库查询用户数据
            var user = _db.Users.FirstOrDefault(x => x.UserId == userId);
            ViewData["User"] = user;
            //查询用户购物车数据
            //用户的购物车数据
            var list = _db.Cars.Where(x => x.Uid == userId).Join(_db.Goods, x => x.GoodId, y => y.Id,
                (x, y) => new CarModel
                {
                    Name = y.Name,
                    Cover = y.Cover,
                    Price = y.Price,
                    Id = y.Id,
                    Count = x.Count,
                }).ToList();
            //传递到视图上
            ViewData["Cars"] = list;

            return View();
        }
        //注册页面
        public IActionResult Register()
        {
            return View();
        }
        //注册账号
        [HttpPost]//写了句子就是说明是post请求 否则
        public IActionResult RegisterAccount(RegisterAccountRequest request)
        {
            //判断用户名是否存在
            var result = _db.Users.Any(x => x.UserName == request.UserName);
            if (result)
                return Content("账号已存在");

            //添加数据
            var data = new User
            {
                CraeteTime = DateTime.Now,
                Password = request.Password,
                Photo = String.Empty,
                UserName = request.UserName
            };
            _db.Users.Add(data);
            var row = _db.SaveChanges();
            if (row > 0)
                return Content("注册成功");
            return Content("注册失败");
        }
        //登录网页
        public IActionResult Login()
        {
            return View();
        }
        //登录账号
        //1、接收前端传递过来参数  账号、密码
        [HttpPost]
        public IActionResult LoginAccount(LoginAccountRequest request)
        {
            //2、验证账号密码是否正确
            //1.用账号去查询数据库 有无这个数据
            //select *  from [User] where UserName='123'
            //查询用户 查询一个用户 条件 用户名= 前端传过来用户名
            var user = _db.Users.FirstOrDefault(x => x.UserName == request.UserName);
            //  如果存在 有这个账号
            if (user != null)
            {
                // 查看结果的密码是否 等于 前端传过来密码
                if (user.Password == request.Password)
                {
                    //1、对登录账号进行授权认证 写入登录状态

                    //存在的话 走登录流程
                    //需要保存的登录信息 列表
                    var claims = new List<Claim>
                    {
                        //                 Key                Value
                        //Id          登录信息的类型（名字）
                        new Claim(ClaimTypes.NameIdentifier,user.UserId.ToString()),
                        //账号
                        new Claim(ClaimTypes.Name, user.UserName),
                        //头像
                        new Claim(ClaimTypes.Thumbprint, user.Photo),
                        //自定义类型 QQ
                        //new Claim("QQ","QQ的值")
                    };
                    //ViewData["名字"]="参数的值"
                    //ViewData["名字"]
                    //把上面登录信息写入登录状态（http上下文）
                    HttpContext.SignInAsync(new ClaimsPrincipal(new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme)));

                    //如果相等 密码正确 
                    return Content("登录成功");
                }
                else
                {
                    // 返回密码不正确
                    return Content("密码不正确");
                }
            }
            //用户不存在
            else
            {
                return Content("用户不存在");
            }
        }
        //退出账号
        [HttpGet]
        public IActionResult LoginOut()
        {
            //执行退出登录操作
            HttpContext.SignOutAsync();
            //跳转（重定向）到首页
            //return RedirectToAction("Index");
            return Redirect("/Index.html");
        }

        //购物车-添加商品
        //添加授权标签
        [Authorize]
        public IActionResult shoppingCarAdd(CarAddRequest request)
        {
            //获取用户Id
            var userId = Convert.ToInt32(HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier).Value);
            //判断商品是否存在
            var result = _db.Cars.FirstOrDefault(x => x.GoodId == request.goodsID && x.Uid == userId);
            if (result != null)
            {
                //return Content("商品已在购物车");
                result.Count++;
                _db.Cars.Update(result);
            }
            else
            {
                //添加数据
                var data = new Car
                {
                    GoodId = request.goodsID,
                    Uid = userId,
                    Count = 1,
                    CreateTime = DateTime.Now,
            };
                _db.Cars.Add(data);
            }
            //执行语句
            var row = _db.SaveChanges();
            if (row > 0)
            {
                return Content("加入购物车成功");
            }
            else
            {
                return Content("加入购物车失败");
            }
        }
    }
}
